import java.util.HashSet;

public class LeetCode136 {
    //位运算
    /*
    初始化：定义一个变量 single 并将其初始化为 0。这是因为任何数与 0 进行异或操作的结果都是该数本身 (a ^ 0 = a)。
    遍历数组：通过增强型 for 循环遍历数组中的每个元素。
    异或操作：
    对于每一对相同的数字，它们的异或结果是 0 (a ^ a = 0)。
    任何数与 0 异或仍然是它自己 (a ^ 0 = a)。
    因此，当我们将数组中所有的数进行异或时，成对出现的数字会相互抵消（即异或结果为0），最终留下那个只出现了一次的数字。
     */
    public static int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }

    /*
    思路：
    1. 准备一个set 集合，逐一放入数组元素
    2. 遇到重复的，则删除
    3. 最后留下来的，就是那个没有重复的数字
     */
    public static int singleNumber2(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (!set.add(num)) {
                set.remove(num);
            }
        }
        return set.iterator().next();
    }

    public static void main(String[] args) {
        int[] nums = {1, 1, 2};
        System.out.println(singleNumber(nums));
    }
}
